package com.bdqn.spark.chapter05.kv

import org.apache.spark.{SparkConf, SparkContext}

object Spark20_RDD_Operator_Transform {
  def main(args: Array[String]): Unit = {
    val sparkConf = new SparkConf()
      .setMaster("local[*]")
      .setAppName("operator-aggregateByKey")
    val sc = new SparkContext(sparkConf)

    // 算子 - (Key - Value类型)

    val rdd = sc.makeRDD(List(
      ("a", 1), ("a", 2), ("a", 3), ("a", 4)
    ), 2)
    // ("a", 1), ("a", 2)
    // （a,3）

    // ("a", 3), ("a", 4)
    // (a,7)

    // aggregateByKey 存在函数柯里化，有两个参数列表
    // 第一个参数列表,需要传递一个参数，表示为初始值
    //       主要用于当碰见第一个key的时候，和value进行分区内计算
    // 第二个参数列表需要传递2个参数
    //      第一个参数表示分区内计算规则
    //      第二个参数表示分区间计算规则
    rdd.aggregateByKey(10)(
      // 分区内计算
      (mid, `val`) => {
        mid + `val`
      },
      // 分区间计算
      (x, y) => {
        x + y
      }
    ).collect().foreach(println)


    sc.stop()
  }
}
